#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<functional>
#include<algorithm>
using namespace std;
//struct Node
//{
//	int k1, k2;
//	int left, right;
//};
//int main()
//{
//	int n;
//	cin >> n;
//	if (n <= 0)
//	{
//		cout << "YES";
//		return 0;
//	}
//	vector<bool> visited(n, false);
//	vector<Node> tree(n);
//	for(int i=0;i<n;i++)
//	{
//		cin >> tree[i].k1 >> tree[i].k2 >> tree[i].left >> tree[i].right;
//		if(tree[i].left != -1)
//			visited[tree[i].left] = true;
//		if (tree[i].right != -1)
//			visited[tree[i].right] = true;
//	}
//	int head;
//	for (int i = 0; i < n; i++)
//	{
//		if (visited[i] == false)
//		{
//			head = i;
//			break;
//		}
//	}
//	function<bool(int)> checkk1 = [&](int node)->bool
//	{
//		if (node == -1)
//			return true;
//		bool tmp = true;
//		if (tree[node].left != -1)
//			tmp &= tree[tree[node].left].k1 < tree[node].k1;
//		if (tree[node].right != -1)
//			tmp &= tree[tree[node].right].k1 > tree[node].k1;
//		return tmp && checkk1(tree[node].left) && checkk1(tree[node].right);
//	};
//	function<bool(int)> checkk2 = [&](int node)->bool
//	{
//		if (node == -1)
//			return true;
//		bool tmp = true;
//		if (tree[node].left != -1)
//			tmp &= tree[tree[node].left].k2 > tree[node].k2;
//		if (tree[node].right != -1)
//			tmp &= tree[tree[node].right].k2 > tree[node].k2;
//		return tmp && checkk2(tree[node].left) && checkk2(tree[node].right);
//	};
//	int flag = checkk1(head) & checkk2(head);
//	if (flag)
//		cout << "YES";
//	else
//		cout << "NO";
//	return 0;
//}

//int main()
//{
//	int n;
//	cin >> n;
//	int sum = 0;
//	priority_queue<int, vector<int>, greater<int>> heap;
//	for (int i = 0; i < n; i++)
//	{
//		int tmp;
//		cin >> tmp;
//		heap.push(tmp);
//	}
//	while (heap.size()>1)
//	{
//		int a = heap.top();
//		heap.pop();
//		a += heap.top();
//		heap.pop();
//		heap.push(a);
//		sum += a;
//	}
//	cout << sum;
//	return 0;
//}
//int main()
//{
//	int n;
//	cin >> n;
//	vector<vector<int>> graph(n + 1);
//	int head;
//	for (int i = 1; i <= n; i++)
//	{
//		int tmp;
//		cin >> tmp;
//		if (tmp == -1)
//			head = i;
//		else
//			graph[tmp].push_back(i);
//	}
//	int path = 0;
//	vector<int> ret;
//	auto bfs=[&](int k)
//	{
//		queue<int> q;
//		q.push(head);
//		int p = 0;
//		while (!q.empty())
//		{
//			int sz = q.size();
//			if (k == 0)
//				path++;
//			else
//				p++;
//			for (int i = 0; i < sz; i++)
//			{
//				int t = q.front();
//				q.pop();
//				if (p == path)
//					ret.push_back(t);
//				for (auto& e : graph[t])
//				{
//					q.push(e);
//				}
//			}
//		}
//	};
//	bfs(0);
//	bfs(1);
//	cout << path << endl;
//	for (int i = 0; i < ret.size() - 1; i++)
//		cout << ret[i] << " ";
//	cout << ret.back();
//	return 0;
////}
//struct Node
//{
//	int data;
//	Node* left, *right;
//	Node(int d=0)
//		:data(d),left(nullptr),right(nullptr)
//	{}
//};
//int main()
//{
//	int n;
//	cin >> n;
//	vector<Node*> v(n);
//	for (int i = 0; i < n; i++)
//	{
//		int tmp;
//		cin >> tmp;
//		v[i] = new Node(tmp);
//	}
//	for (int i = 1; i < n; i++)
//	{
//		Node* cur = v[0],*pre=v[0];
//		while (cur)
//		{
//			pre = cur;
//			if (v[i]->data > cur->data)
//				cur = cur->left;
//			else
//				cur = cur->right;
//		}
//		if (v[i]->data > pre->data)
//			pre->left=v[i];
//		else
//			pre->right = v[i];
//	}
//	auto bfs = [&]()->bool
//	{
//		queue<Node*> q;
//		q.push(v[0]);
//		bool flag = false;
//		while (!q.empty())
//		{
//			auto tmp = q.front();
//			q.pop();
//			if (tmp->left)
//			{
//				if (flag)
//					return false;
//				q.push(tmp->left);
//			}
//			else
//				flag=true;
//			if (tmp->right)
//			{
//				if (flag)
//					return false;
//				q.push(tmp->right);
//			}
//			else
//				flag = true;
//		}
//		return true;
//	};
//	vector<int> ret;
//	auto levelorder = [&]()
//	{
//		queue<Node*> q;
//		q.push(v[0]);
//		while (!q.empty())
//		{
//			int sz = q.size();
//			for (int i = 0; i < sz; i++)
//			{
//				auto tmp = q.front();
//				q.pop();
//				ret.push_back(tmp->data);
//				if (tmp->left)
//					q.push(tmp->left);
//				if (tmp->right)
//					q.push(tmp->right);
//			}
//		}
//	};
//	levelorder();
//	for (int i = 0; i < ret.size() - 1; i++)
//	{
//		cout << ret[i] << " ";
//	}
//	cout << ret.back() << endl;
//	if (bfs())
//		cout << "YES";
//	else
//		cout << "NO";
//	return 0;
//}*/
vector<vector<int>> highestRankedKItems(vector<vector<int>>& grid, vector<int>& pricing, vector<int>& start, int k) {
	int m = grid.size(), n = grid[0].size();
	int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };
	vector<vector<int>> ret;
	vector<vector<bool>> visited(m, vector<bool>(n, false));
	visited[start[0]][start[1]] = true;
	auto bfs = [&]()
	{
		queue<pair<int, int>> q;
		q.push({ start[0],start[1] });
		int path = 0;
		if (grid[start[0]][start[1]] >= pricing[0] && grid[start[0]][start[1]] <= pricing[1])
		{
			ret.push_back({ start[0], start[1] });
			path++;
		}
		while (!q.empty())
		{
			int sz = q.size();
			int tmp = path;
			for (int i = 0; i < sz; i++)
			{
				auto [x1, y1] = q.front();
				q.pop();
				for (int k = 0; k < 4; k++)
				{
					int x2 = x1 + dx[k], y2 = y1 + dy[k];
					if (x2 >= 0 && x2 < m && y2 >= 0 && y2 < n && visited[x2][y2] == false
						&& grid[x2][y2] != 0)
					{
						q.push({ x2,y2 });
						visited[x2][y2] = true;
						if (grid[x2][y2] >= pricing[0] && grid[x2][y2] <= pricing[1])
						{
							ret.push_back({ x2, y2 });
							path++;
						}
					}
				}
			}
			sort(ret.begin() + tmp, ret.end(), [&](vector<int> x, vector<int> y)
				{
					if (grid[x[0]][x[1]] != grid[y[0]][y[1]])
						return grid[x[0]][x[1]] < grid[y[0]][y[1]];
					else if (x[0] != y[0])
						return x[0] < y[0];
					else
						return x[1] < y[1];
				});
		}
	};
	bfs();
	int sz = ret.size();
	int tmp = sz - k;
	while (tmp > 0)
	{
		ret.pop_back();
		tmp--;
	}
	return ret;
}
int main()
{

	return 0;
}